iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0
自我挑戰組

挑戰typescript+react+golang+graphql系列 第 6

Day6. Goroutine, sync.WaitGroup

  • 分享至 

  • xImage
  •  

先介紹幾個關鍵字
Concurrency:併發
Parallelism:並行

Concurrency

不同的代碼塊會依照順序在process上執行,以一個cpu為基礎,使用multi-threading等方式提高cpu的使用率,
thread之間會互相切換,輪流被interpreter執行。

Parallelism

不同的代碼塊同時執行,以多核cpu為基礎,每個cpu獨立執行一個process,各個cpu之間的數據互相獨立。

https://ithelp.ithome.com.tw/upload/images/20220920/20150497Ou8qjgA0ar.png

main()其實就是一個goroutine,除了main(),只要在func外加入go關鍵字就可以建造新的goroutine執行Concurrency。

package main

import (
	"fmt"
	"time"
)

func loopTime() {
	for i := 0; i < 5; i++ {
		fmt.Println(time.Now())
		time.Sleep(1 * time.Second)
	}
}
func main() {
	go loopTime()

	for i := 0; i < 5; i++ {
		fmt.Println("Hi")
		time.Sleep(1 * time.Second)
	}
}

程式先為main()創造一個goroutine,在loopTime()前面加上go,又會再創造一個新的goroutine。

也可以使用匿名方法(Anonymous function)來創造goroutine

匿名方法的簡單範例

// Go program to illustrate how
// to create an anonymous function
package main

import "fmt"

func main() {

	// Anonymous function
	func(){

		fmt.Println("Welcome! to GeeksforGeeks")
	}()

}

匿名方法創造goroutine,就是在匿名方法前加入go關鍵字

package main

import (
	"fmt"
	"time"
)

func loopTime() {
	for i := 0; i < 5; i++ {
		fmt.Println(time.Now())
		time.Sleep(1 * time.Second)
	}
}

func main() {

	// Anonymous function
	go func() {
		loopTime()
	}()
	
	for i := 0; i < 5; i++ {
		fmt.Println("Hi")
		time.Sleep(1 * time.Second)
	}
}

Go內建的sync.WaitGroup內部有一個計數器,最初從0開始,它有三個方法:Add(), Done(), Wait() 用來控制計數器的數量。Add(n) 把計數器設置為n ,Done() 每次把計數器-1 ,wait() 會阻塞代碼的運行,直到計數器地值減為0。

將code修改如下,會發現程式會因為wg.Wait()的關係處於等待狀態,等go func 結束,wg.Done()將計數器歸0後,才會繼續執行印出5次hi的動作。

package main

import (
	"fmt"
	"sync"
	"time"
)

func loopTime() {
	for i := 0; i < 5; i++ {
		fmt.Println(time.Now())
		time.Sleep(1 * time.Second)
	}
}

func main() {

	wg := sync.WaitGroup{}
	wg.Add(1)
	go func() {
		loopTime()
		wg.Done()
	}()
	wg.Wait()

	for i := 0; i < 5; i++ {
		fmt.Println("Hi")
		time.Sleep(1 * time.Second)
	}
}


上一篇
Day5 interface
下一篇
Day7. sync.Mutex, Channel
系列文
挑戰typescript+react+golang+graphql18
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言